#include <iostream>
#include <unistd.h>
#include <cstdio>
#include "comm.hpp"

int main()
{
    char buffer[1024];
    setNonBlock(0);
    while (true)
    {
        printf("Enter# ");
        fflush(stdout);

        ssize_t n = ::read(0, buffer, sizeof(buffer));
        if (n > 0)
        {
            sleep(1);
            buffer[n] = 0;
            printf("echo# %s", buffer);
        }
        // 如果在进程运行的过程中，输入ctrl + d
        // 表明当前输入结束，read函数的返回值就是 0
        else if(n == 0) 
        {
            sleep(1);
            printf("read done\n");
            break;
        }
        else
        {
            // 如果是非阻塞，并且底层的数据没有就绪，IO接口会以出错的形式返回
            // 所以通过 read 函数的返回值是无法区分 是下面情况中的哪种
            // case1: 读取文件出错     case2: 资源未就绪
            // 只能通过read函数的错误码errno来区分
            // 如果读取数据时，底层数据没就绪，就会返回EWOULDBLOCK
            // 这个错误码errno 是11
            printf("errno=%d\n", errno);
            if (errno == EWOULDBLOCK)
            {
                sleep(1);
                std::cout << "底层数据没有就绪，非阻塞IO要求持续检测就绪状态！" << std::endl;
                //如果进入这个代码块，说明了：
                // 当前的进程 没有在while循环的一开始获得数据
                // 也就是说 用户没有给输入缓冲区键入 [数据] + \n
                // 注意：\n可以帮助操作系统识别到以下内容
                // 当前的输入缓冲区中的内容可以刷新到输入缓冲区了
                continue;
            }
            else if (errno == EINTR)
            {
                continue;
            }
            
            else
            {
                sleep(1);
                perror("read");
                break;
            }     
        }
        sleep(1);
    } 

    return 0;
}
